{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "9ecefda0-bc0f-45ef-9b1c-4aa3ddd75809",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a754e55a-c639-4c8b-aec3-249ff096eaac",
   "metadata": {},
   "source": [
    "# 创建数组"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bb45fad5-ac9a-4e0a-919c-dd19830a781d",
   "metadata": {},
   "source": [
    "## Ones 和 zeros 填充方式\n",
    "\n",
    "方法|描述\n",
    "--:|:--\n",
    "empty(shape[, dtype, order])|返回给定形状和类型的新数组，而无需初始化条目。\n",
    "empty_like(prototype[, dtype, order, subok, …])|返回形状和类型与给定数组相同的新数组。\n",
    "eye(N[, M, k, dtype, order])|返回一个二维数组，对角线上有一个，其他地方为零。\n",
    "identity(n[, dtype])|返回标识数组。\n",
    "ones(shape[, dtype, order])|返回给定形状和类型的新数组，并填充为1。\n",
    "ones_like(a[, dtype, order, subok, shape])|返回形状与类型与给定数组相同的数组。\n",
    "zeros(shape[, dtype, order])|返回给定形状和类型的新数组，并用零填充。\n",
    "zeros_like(a[, dtype, order, subok, shape])|返回形状与类型与给定数组相同的零数组。\n",
    "full(shape, fill_value[, dtype, order])|返回给定形状和类型的新数组，并用fill_value填充。\n",
    "full_like(a, fill_value[, dtype, order, …])|返回形状和类型与给定数组相同的完整数组。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "2a807eb9-88d8-4e70-b48c-6311e12d7a9f",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[140556428707616,               0],\n",
       "       [           1408,              -1]])"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.empty([2, 2], dtype=int)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "b4e88098-b7a4-42de-92bc-ea047a7a98d0",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 1, 0],\n",
       "       [0, 0, 1],\n",
       "       [0, 0, 0]])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.eye(3, dtype=int, k=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "9cdac478-3f2a-4bef-85c1-2c76652ea839",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([0., 1., 2.]), array([1., 1., 1.]))"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y = np.arange(3, dtype=float)\n",
    "y, np.ones_like(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "48fca3ef-f579-4e96-94b3-927a7c747963",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1., inf],\n",
       "       [ 1., inf]])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.full((2, 2), [1, np.inf])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f352c8a2-a6d3-43e5-a7e7-3ed4e6078d05",
   "metadata": {},
   "source": [
    "## 从现有的数据创建\n",
    "\n",
    "方法|描述\n",
    "--:|:--\n",
    "array(object[, dtype, copy, order, subok, ndmin])|创建一个数组。\n",
    "asarray(a[, dtype, order])|将输入转换为数组。\n",
    "asanyarray(a[, dtype, order])|将输入转换为ndarray，但通过ndarray子类。\n",
    "ascontiguousarray(a[, dtype])|返回内存中的连续数组（ndim > = 1）（C顺序）。\n",
    "asmatrix(data[, dtype])|将输入解释为矩阵。\n",
    "copy(a[, order])|返回给定对象的数组副本。\n",
    "frombuffer(buffer[, dtype, count, offset])|将缓冲区解释为一维数组。\n",
    "fromfile(file[, dtype, count, sep, offset])|根据文本或二进制文件中的数据构造一个数组。\n",
    "fromfunction(function, shape, **kwargs)|通过在每个坐标上执行一个函数来构造一个数组。\n",
    "fromiter(iterable, dtype[, count])|从可迭代对象创建一个新的一维数组。\n",
    "fromstring(string[, dtype, count, sep])|从字符串中的文本数据初始化的新一维数组。\n",
    "loadtxt(fname[, dtype, comments, delimiter, …])|从文本文件加载数据。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "ed5c3d43-b7d1-43e3-9d32-953b5078f6dd",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 3], dtype=int32)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.array([(1,2),(3,4)],dtype=[('a','<i4'),('b','<i4')])\n",
    "x['a']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "e64f19f8-3fd9-4af2-82e1-56d37ad5f637",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([(1., 2), (3., 4)], dtype='f4,i4').view(np.recarray)\n",
    "np.asarray(a) is a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "eccbfb66-3512-474c-b917-e353a8111fd8",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 'm', list([10, 3, 4])], dtype=object)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([1, 'm', [2, 3, 4]], dtype=object)\n",
    "b = np.copy(a)\n",
    "b[2][0] = 10\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "5f658ac2-a4a7-44eb-a56d-76f046dc75e5",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([1, 'm', list([10, 3, 4])], dtype=object),\n",
       " array([1, 'm', list([2, 3, 4])], dtype=object))"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import copy\n",
    "a = np.array([1, 'm', [2, 3, 4]], dtype=object)\n",
    "c = copy.deepcopy(a)\n",
    "c[2][0] = 10\n",
    "c, a"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b3ba2acb-db9f-4779-9b02-3b303c316264",
   "metadata": {},
   "source": [
    "## 数值范围\n",
    "\n",
    "方法|描述\n",
    "--:|:--\n",
    "arange([start,] stop[, step,][, dtype])|返回给定间隔内的均匀间隔的值。\n",
    "linspace(start, stop[, num, endpoint, …])|返回指定间隔内的等间隔数字。\n",
    "logspace(start, stop[, num, endpoint, base, …])|返回数以对数刻度均匀分布。\n",
    "geomspace(start, stop[, num, endpoint, …])|返回数字以对数刻度（几何级数）均匀分布。\n",
    "meshgrid(*xi, **kwargs)|从坐标向量返回坐标矩阵。\n",
    "mgrid|nd_grid实例，它返回一个密集的多维“ meshgrid”。\n",
    "ogrid|nd_grid实例，它返回一个开放的多维“ meshgrid”。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "d23f931a-274e-4380-ab69-a67765ade476",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([0, 1, 7776, 8801, 6176, 625, 6576, 4001],\n",
       " [0, 1, 7776, 7185, 0, 5969, 4816, 3361])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "power = 40\n",
    "modulo = 10000\n",
    "x1 = [(n ** power) % modulo for n in range(8)]\n",
    "x2 = [(n ** power) % modulo for n in np.arange(8)]\n",
    "x1, x2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "7c304f91-4d6b-4d15-be98-dc5de4133d73",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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a82fPz/6OhwOW+np6VZ5eXkMq3K+pqYmS5L1xhtvxLoUxzly5Ih17rnnWtu2bbN+8IMfWAsXLox1SY6zZMkS6+KLL451GY43ffp06/rrr28z9pOf/MSaNWtWjCpyHknWli1boq8jkYiVlpZmPfjgg9Gxw4cPW2632/rjH//YKzVx5uUUWltbVVtbK7/fHx1LSEiQ3+9XdXV1DCtzvmAwKEkaPHhwjCtxnvnz52v69Olt/l6jZ23dulU5OTn62c9+ptTUVE2cOFEbN26MdVmOM2nSJFVVVemjjz6SJP3973/Xm2++qcsvvzzGlTnX3r17FQgE2vz74fV6lZeX12vHRcf9VumedvDgQYXDYfl8vjbjPp9Pu3fvjlFVzheJRLRo0SJNnjxZ48aNi3U5jvL000+rrq5OO3bsiHUpjvbpp5/q0UcfVXFxse644w7t2LFDt956q5KTkzVnzpxYl+cYJSUlCoVCGj16tBITExUOh3Xfffdp1qxZsS7NsQKBgCS1e1z8+md2I7wgLs2fP187d+7Um2++GetSHKWhoUELFy7Utm3blJKSEutyHC0SiSgnJ0crVqyQJE2cOFE7d+7U+vXrCS896JlnntFTTz2lTZs26fzzz1d9fb0WLVqk9PR01tnB+NroFIYMGaLExEQ1Nja2GW9sbFRaWlqMqnK2BQsW6MUXX9Rrr72ms846K9blOEptba2ampp04YUXKikpSUlJSXrjjTf08MMPKykpSeFwONYlOsawYcM0duzYNmNjxozRvn37YlSRM91+++0qKSnRlVdeqfHjx+vaa6/V4sWLVV5eHuvSHOvrY18sj4uEl1NITk5Wdna2qqqqomORSERVVVXKz8+PYWXOY1mWFixYoC1btujVV1/VyJEjY12S40yZMkXvv/++6uvro1tOTo5mzZql+vp6JSYmxrpEx5g8efJJt/p/9NFH+t73vhejipzp2LFjSkhoeyhLTExUJBKJUUXON3LkSKWlpbU5LoZCIb3zzju9dlzka6MuKC4u1pw5c5STk6Pc3FytWbNGzc3NKioqinVpjjJ//nxt2rRJf/7znzVgwIDod6der1f9+/ePcXXOMGDAgJOuITr99NN15plncm1RD1u8eLEmTZqkFStW6Oc//7lqamq0YcMGbdiwIdalOUphYaHuu+8+jRgxQueff77ee+89rV69Wtdff32sSzPa0aNH9fHHH0df7927V/X19Ro8eLBGjBihRYsW6d5779W5556rkSNHaunSpUpPT9eMGTN6p8BeuafJAdauXWuNGDHCSk5OtnJzc62333471iU5jqR2t9///vexLs3RuFXaPi+88II1btw4y+12W6NHj7Y2bNgQ65IcJxQKWQsXLrRGjBhhpaSkWKNGjbLuvPNOq6WlJdalGe21115r99/jOXPmWJZ14nbppUuXWj6fz3K73daUKVOsPXv29Fp9LsviMYQAAMAcXPMCAACMQngBAABGIbwAAACjEF4AAIBRCC8AAMAohBcAAGAUwgsAADAK4QUAABiF8AIAAIxCeAEAAEYhvAAAAKP8H2a0oZhfBad0AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "N = 8\n",
    "y = np.zeros(N)\n",
    "x1 = np.linspace(0, 10, N, endpoint=True)\n",
    "x2 = np.linspace(0, 10, N, endpoint=False)\n",
    "plt.plot(x1, y, 'o')\n",
    "plt.plot(x2, y + 0.5, 'o')\n",
    "plt.ylim([-0.5, 1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "db704fca-df6e-409a-ae74-e61801b79163",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x1 = np.logspace(0.1, 1, N, endpoint=True)\n",
    "x2 = np.logspace(0.1, 1, N, endpoint=False)\n",
    "plt.plot(x1, y, 'o')\n",
    "plt.plot(x2, y + 0.5, 'o')\n",
    "plt.ylim([-0.5, 1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "334c41d5-843d-4507-9b03-070d3b76634f",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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zxzXYWTXrl16+umndeDAAdXX12vz5s0qKSkJO6empkalpaU6fPiw8vLy9Oijj2r58uURlpxYth2qV/l//lb1zRcleVR5dL+GD8jUmrvydeek4dblRVXwWi9L5rWu/c1hNbR4pEOfSkrutV59XQf2k1LyGvWXU0YZVhZ92w836rF90tkP9nds60vXta+t9f8sGG9YVWwk62eO62/TtLa2qqCgQBs2bHA0/vjx41q4cKHmzp2ruro6PfTQQ7rvvvu0fft218Ummm2H6vXArw8G/QWQpIbmi3rg1we17VC9UWXR1xfX2tDiDdqezGu9+rqevST98PVPkm6tP3z9E529FLy9L13XvrbWH77+ieq+NiosBpL5uroOIwsWLNA///M/6/vf/76j8S+++KLGjh2rZ555RhMmTNCqVat09913a926da6LTSTt/oDK//O36upu9pVt5f/5W7Unwf1u1npZX1qrdPmWb3KuNfh2dl+6rn1xrW9+rj6z1t58XWP+zEhtba3mz58ftK24uFgPPfRQyDler1de7zf/V9rS0iJJ8vl8amtrC3s+n88X9N9IxoTbf2XbR59/3Smd/qmApPrmi6o9dlozEuh7l06+Plf76HiT47UW5mW7Pn40anQzJ9zYaK011DkiWVusuFlrtHs4Gl8HN8eIZK3xei9xu6878bquse5lJ8d3stazlzz66POvNeuGP4vqud2M5TOne55AIBBxjPJ4PN0+M/Ltb39bK1asUFlZWce2t956SwsXLtSFCxd0zTXXdJqzdu1alZeXd9peVVWlrKysSMuNqv1fSZVHu39gaPn4gKY5/zuQkFhrZ6y1d2GtnbHW3qW3rvXChQtavHixmpublZ2dHXJcQv40TVlZmUpLSztet7S0KC8vT7Nnz1ZOTvjE5/P5VF1drXnz5iktrevldTcm3P4r++bOnKrKox93u5b5t9yccCm1u6/P1QYeb1Ll0f3djpt/y80qzMt2ffxo1OhmTrix0VprqHNEsrZYcbPWWNwZiWefRLLWeL2XuN3XnXhd11j3spPjO13r3JlTXd8Zicb7idMxyfyZ09TU5GhczN8Nc3Nz1djYGLStsbFR2dnZXd4VkaSMjAxlZGR02p6Wlqb09HRH53Uytrsx4fbPuH6Ihg/IVEPzxS6/h+eRlDsgM2F/5MrN17LohqGO1+pv97k+fjRqjGRO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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.semilogx(np.geomspace(1, 1000, N, endpoint=True), y + 1, 'o')\n",
    "plt.semilogx(np.geomspace(1, 1000, N, endpoint=False), y + 2, 'o')\n",
    "plt.axis([0.5, 2000, 0, 3])\n",
    "plt.grid(True, color='0.7', linestyle='-', which='both', axis='both')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "ea4709ef-e3b3-41f1-94ee-c8aa15b59ffb",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.linspace(-5, 5, 101)\n",
    "y = np.linspace(-5, 5, 101)\n",
    "xx, yy = np.meshgrid(x, y)\n",
    "zz = np.sqrt(xx**2 + yy**2)\n",
    "xx.shape, yy.shape, zz.shape\n",
    "xs, ys = np.meshgrid(x, y, sparse=True)\n",
    "zs = np.sqrt(xs**2 + ys**2)\n",
    "xs.shape, ys.shape, zs.shape\n",
    "np.array_equal(zz, zs)\n",
    "h = plt.contourf(x, y, zs)\n",
    "plt.axis('scaled')\n",
    "plt.colorbar()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "966fee8a-3519-4a35-9b3d-89e84dcd3504",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[0, 0, 0, 0, 0],\n",
       "        [1, 1, 1, 1, 1],\n",
       "        [2, 2, 2, 2, 2],\n",
       "        [3, 3, 3, 3, 3],\n",
       "        [4, 4, 4, 4, 4]],\n",
       "\n",
       "       [[0, 1, 2, 3, 4],\n",
       "        [0, 1, 2, 3, 4],\n",
       "        [0, 1, 2, 3, 4],\n",
       "        [0, 1, 2, 3, 4],\n",
       "        [0, 1, 2, 3, 4]]])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mgrid[0:5, 0:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "7ba23196-1569-4f3f-8f86-cce16d5e4aed",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-1. , -0.5,  0. ,  0.5,  1. ])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mgrid[-1:1:5j]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "18777d2a-b0eb-4846-b7aa-e394cccba780",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-1. , -0.5,  0. ,  0.5,  1. ])"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.ogrid[-1:1:5j]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "00e1351a-90ab-41a7-a4a1-035ca1f0fbe3",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[array([[0],\n",
       "        [1],\n",
       "        [2],\n",
       "        [3],\n",
       "        [4]]),\n",
       " array([[0, 1, 2, 3, 4]])]"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.ogrid[0:5,0:5]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e6209d06-308a-41d3-89fe-c5825940da46",
   "metadata": {},
   "source": [
    "# 数组处理程序"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "76c665f0-d11c-405e-9c30-50d7e7a3d9e8",
   "metadata": {},
   "source": [
    "## 改变数组形状\n",
    "\n",
    "方法|描述\n",
    "--:|:--\n",
    "reshape(a, newshape[, order])|在不更改数据的情况下为数组赋予新的形状。\n",
    "ravel(a[, order])|返回一个连续的扁平数组。\n",
    "ndarray.flat|数组上的一维迭代器。\n",
    "ndarray.flatten([order])|返回折叠成一维的数组副本。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "c47b3b62-50c0-45f4-a308-5b86d6ad752f",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 2, 3, 4, 5, 6])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([[1,2,3], [4,5,6]])\n",
    "np.reshape(a, 6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "7a8401f6-d869-4938-96c3-a951cc39cf21",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 4, 2, 5, 3, 6])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.reshape(a, 6, order='F')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "17b45544-deb1-4d02-8af2-e466e96f54c6",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 2, 3],\n",
       "       [4, 5, 6]])"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([[1, 2, 3], [4, 5, 6]]); a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "eb0576c5-7e8e-41d6-8634-a1fd449ac9a1",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 2, 3, 4, 5, 6])"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.ravel(order='C')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "5644a6c2-a078-494e-afe3-962257c791a9",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 2, 3, 4, 5, 6])"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.ravel(order='K')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "16c3050b-198e-4c6d-b12e-047363a7f76d",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 2, 3],\n",
       "       [4, 5, 6]])"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.arange(1, 7).reshape(2, 3);x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "c39b4620-762d-4465-8bca-a201e5b93e15",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.flat[3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "32be8b65-30fe-4c04-baf3-b4629bf2088e",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 4],\n",
       "       [2, 5],\n",
       "       [3, 6]])"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "0f2c5f55-9bb3-480d-bd0c-7d8d09fbf051",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.T.flat[3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "28ddf813-67ea-4b61-a426-ec48f2282b2a",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 1, 3],\n",
       "       [4, 1, 6]])"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.flat[[1,4]] = 1; x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "2ed2eef3-9f69-47d6-978c-18d1a3f12d52",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 2, 3, 4])"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([[1,2], [3,4]])\n",
    "a.flatten()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "3e11d18e-75d8-4eb5-895c-0121389b7e59",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 3, 2, 4])"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.flatten('F')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9c1587b6-84e2-4a4a-8643-168e2fadb9c1",
   "metadata": {},
   "source": [
    "## 类转置操作\n",
    "\n",
    "方法|描述\n",
    "--:|:--\n",
    "moveaxis(a, source, destination)|将数组的轴移到新位置。\n",
    "rollaxis(a, axis[, start])|向后滚动指定的轴，直到其位于给定的位置。\n",
    "swapaxes(a, axis1, axis2)|互换数组的两个轴。\n",
    "ndarray.T|转置数组。\n",
    "transpose(a[, axes])|排列数组的尺寸。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "7dc4ad1b-bb0e-420f-bbdb-30a3963d396f",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[1, 2],\n",
       "        [3, 4]]),\n",
       " array([[1, 3],\n",
       "        [2, 4]]))"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([[1, 2], [3, 4]])\n",
    "a, a.T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "edf63cf4-5b20-43c1-8d08-979c0b86c4f9",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[1, 2],\n",
       "        [3, 4]]),\n",
       " array([[1, 3],\n",
       "        [2, 4]]))"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([[1, 2], [3, 4]])\n",
    "a, np.transpose(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "6d7ef62c-d7f6-4f5c-847c-9b84e284e7eb",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2, 1, 3)"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.ones((1, 2, 3))\n",
    "np.transpose(a, (1, 0, 2)).shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9c1b7ede-a9c0-4dd9-9a0b-938163eb8b81",
   "metadata": {},
   "source": [
    "## 更改维度数\n",
    "\n",
    "方法|描述\n",
    "--:|:--\n",
    "atleast_1d(*arys)|将输入转换为至少一维的数组。\n",
    "atleast_2d(*arys)|将输入视为至少具有二维的数组。\n",
    "atleast_3d(*arys)|以至少三个维度的数组形式查看输入。\n",
    "broadcast|产生模仿广播的对象。\n",
    "broadcast_to(array, shape[, subok])|将数组广播为新形状。\n",
    "broadcast_arrays(*args, **kwargs)|互相广播任意数量的阵列。\n",
    "expand_dims(a, axis)|扩展数组的形状。\n",
    "squeeze(a[, axis])|从数组形状中删除一维条目。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1ccd9cc5-98ff-4dcd-aa8d-d67152b1faa7",
   "metadata": {},
   "source": [
    "## 组合数组\n",
    "\n",
    "方法|描述\n",
    "--:|:--\n",
    "concatenate((a1, a2, …)|沿现有轴连接一系列数组。\n",
    "stack(arrays[, axis, out])|沿新轴连接一系列数组。\n",
    "column_stack(tup)|将一维数组作为列堆叠到二维数组中。\n",
    "dstack(tup)|沿深度方向（沿第三轴）按顺序堆叠数组。\n",
    "hstack(tup)|水平（按列）顺序堆叠数组。\n",
    "vstack(tup)|垂直（行）按顺序堆叠数组。\n",
    "block(arrays)|从块的嵌套列表中组装一个nd数组。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "3ad25de6-eb91-4308-aae8-8be05139ff6a",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 2],\n",
       "       [3, 4],\n",
       "       [5, 6]])"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([[1, 2], [3, 4]])\n",
    "b = np.array([[5, 6]])\n",
    "np.concatenate((a, b), axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "25e9407f-a264-4634-a2d3-c7eaba365c90",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 2, 5],\n",
       "       [3, 4, 6]])"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.concatenate((a, b.T), axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "fbac6734-953f-4628-b19c-1d2eb0196fcb",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 2, 3, 4, 5, 6])"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.concatenate((a, b), axis=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "79c65b9a-be91-4792-b605-d9dc4f78beb9",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 2, 3],\n",
       "       [4, 5, 6]])"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([1, 2, 3])\n",
    "b = np.array([4, 5, 6])\n",
    "np.stack((a, b))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "e3159c11-5c90-41f8-9eac-f3583046fe00",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 4],\n",
       "       [2, 5],\n",
       "       [3, 6]])"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.stack((a, b), axis=-1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b46c82c8-ab91-4c80-a56e-6aa86036039a",
   "metadata": {},
   "source": [
    "## 拆分数组\n",
    "\n",
    "方法|描述\n",
    "--:|:--\n",
    "split(ary, indices_or_sections[, axis])|将数组拆分为多个子数组，作为ary的视图。\n",
    "array_split(ary, indices_or_sections[, axis])|将一个数组拆分为多个子数组。\n",
    "dsplit(ary, indices_or_sections)|沿第3轴（深度）将数组拆分为多个子数组。\n",
    "hsplit(ary, indices_or_sections)|水平（按列）将一个数组拆分为多个子数组。\n",
    "vsplit(ary, indices_or_sections)|垂直（行）将数组拆分为多个子数组。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "6af45c1b-8334-41fb-8b84-92db348691ab",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[array([0., 1., 2.]), array([3., 4., 5.]), array([6., 7., 8.])]"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.arange(9.0)\n",
    "np.split(x, 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "aa24f594-e13f-44b4-b7a8-15dd061876f0",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[array([0., 1., 2.]),\n",
       " array([3., 4.]),\n",
       " array([5.]),\n",
       " array([6., 7.]),\n",
       " array([], dtype=float64)]"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.arange(8.0)\n",
    "np.split(x, [3, 5, 6, 10])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "41cb0c6f-5efe-4f2e-8ea9-66b2b5449c78",
   "metadata": {},
   "source": [
    "## 平铺数组\n",
    "\n",
    "方法|描述\n",
    "--:|:--\n",
    "tile(A, reps)|通过重复A代表次数来构造一个数组。\n",
    "repeat(a, repeats[, axis])|重复数组的元素。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "9b22489e-de12-4738-8b28-8a53d0e36992",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 1, 2, 0, 1, 2],\n",
       "       [0, 1, 2, 0, 1, 2]])"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([0, 1, 2])\n",
    "np.tile(a, (2, 2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "e5812476-e051-4a18-8ad6-e43db909544b",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 2],\n",
       "       [3, 4],\n",
       "       [3, 4]])"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.array([[1,2],[3,4]])\n",
    "np.repeat(x, [1, 2], axis=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f55717fa-1bdd-414c-8a2c-8d1bfe25aaa5",
   "metadata": {},
   "source": [
    "## 添加和删除元素\n",
    "\n",
    "方法|描述\n",
    "--:|:--\n",
    "delete(arr, obj[, axis])|返回一个新的数组，该数组具有沿删除的轴的子数组。\n",
    "insert(arr, obj, values[, axis])|沿给定轴在给定索引之前插入值。\n",
    "append(arr, values[, axis])|将值附加到数组的末尾。\n",
    "resize(a, new_shape)|返回具有指定形状的新数组。\n",
    "trim_zeross(filt[, trim])|修剪一维数组或序列中的前导和/或尾随零。\n",
    "unique(ar[, return_index, return_inverse, …])|查找数组的唯一元素。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "d8a7e776-8d46-4dbb-a437-a633c7f47432",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([1, 2, 3, 4, 6]), array([0, 1, 4, 3, 1, 2, 1]))"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([1, 2, 6, 4, 2, 3, 2])\n",
    "u, indices = np.unique(a, return_inverse=True)\n",
    "u, indices"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "8f940bc8-9a10-4cdc-bc33-327f32f14df2",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 2, 6, 4, 2, 3, 2])"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "u[indices]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "48d2e1c0-b13f-4d9e-9029-69e590047657",
   "metadata": {},
   "source": [
    "## 重新排列元素\n",
    "\n",
    "方法|描述\n",
    "--:|:--\n",
    "flip(m[, axis])|沿给定轴颠倒数组中元素的顺序。\n",
    "fliplr(m)|左右翻转数组。\n",
    "flipud(m)|上下翻转阵列。\n",
    "reshape(a, newshape[, order])|在不更改数据的情况下为数组赋予新的形状。\n",
    "roll(a, shift[, axis])|沿给定轴滚动数组元素。\n",
    "rot90(m[, k, axes])|在轴指定的平面中将阵列旋转90度。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "4652deae-4407-4082-8ed0-3a59766e3e33",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[0, 1],\n",
       "        [2, 3]],\n",
       "\n",
       "       [[4, 5],\n",
       "        [6, 7]]])"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A = np.arange(8).reshape((2,2,2))\n",
    "A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "186190b7-5f04-44c9-8dfd-f1cd74e255d4",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[4, 5],\n",
       "        [6, 7]],\n",
       "\n",
       "       [[0, 1],\n",
       "        [2, 3]]])"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.flip(A, 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "aaa683ed-a01f-4ef2-a4e6-94a54932da97",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[2, 3],\n",
       "        [0, 1]],\n",
       "\n",
       "       [[6, 7],\n",
       "        [4, 5]]])"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.flip(A, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "ac44fe46-33e9-4c91-ad81-0e056f6e86bd",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[5, 4],\n",
       "        [7, 6]],\n",
       "\n",
       "       [[1, 0],\n",
       "        [3, 2]]])"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.flip(A, (0, 2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "16224a35-ee07-4d1c-8d21-00dc480baa40",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 0., 0.],\n",
       "       [0., 2., 0.],\n",
       "       [0., 0., 3.]])"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A = np.diag([1.,2.,3.])\n",
    "A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "6d1784c5-b3e1-4263-958a-0e80cae7bcfa",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 1.],\n",
       "       [0., 2., 0.],\n",
       "       [3., 0., 0.]])"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.fliplr(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "e227917a-1234-440a-857e-f677f25ac3c8",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 3.],\n",
       "       [0., 2., 0.],\n",
       "       [1., 0., 0.]])"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.flipud(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "762b14cb-3b2b-4460-99f6-64db1800c24d",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 2],\n",
       "       [3, 4]])"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m = np.array([[1,2],[3,4]], int)\n",
    "m"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "36e5564f-e11f-4760-9810-7674ae28bd4c",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[2, 4],\n",
       "       [1, 3]])"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.rot90(m)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "f7de727c-2054-4cf8-b3a4-73e897425e7e",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[4, 3],\n",
       "       [2, 1]])"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.rot90(m, 2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "e5b1a62d-d609-41a1-8ccd-e0e8b85d7bcf",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[0, 1],\n",
       "        [2, 3]],\n",
       "\n",
       "       [[4, 5],\n",
       "        [6, 7]]])"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m = np.arange(8).reshape((2,2,2))\n",
    "m"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "5402d902-18c1-42f1-b001-a408d4ab51b8",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[1, 3],\n",
       "        [0, 2]],\n",
       "\n",
       "       [[5, 7],\n",
       "        [4, 6]]])"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.rot90(m, 1, (1,2))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f1345f07-15da-46db-a58f-46d1afddddbc",
   "metadata": {},
   "source": [
    "# 索引相关"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "89a5c8c6-b423-41f1-a1eb-9ea51b318607",
   "metadata": {},
   "source": [
    "## 生成索引数组\n",
    "\n",
    "方法|描述\n",
    "--:|:--\n",
    "c_|将切片对象平移到第二个轴上并置。\n",
    "r_|将切片对象平移到沿第一个轴的连接。\n",
    "s_|为数组建立索引元组的更好方法。\n",
    "nonzero(a)|返回非零元素的索引。\n",
    "where(condition, [x, y])|根据条件返回从x或y中选择的元素。\n",
    "indices(dimensions[, dtype, sparse])|返回表示网格索引的数组。\n",
    "ix_(*args)|从多个序列构造一个开放的网格。\n",
    "ogrid|nd_grid实例，它返回一个开放的多维“ meshgrid”。\n",
    "ravel_multi_index(multi_index, dims[, mode, …])|将边界模式应用于多索引，将索引数组的元组转换为平面索引的数组。\n",
    "unravel_index(indices, shape[, order])|将平面索引或平面索引数组转换为坐标数组的元组。\n",
    "diag_indices(n[, ndim])|返回索引以访问数组的主对角线。\n",
    "diag_indices_from(arr)|返回索引以访问n维数组的主对角线。\n",
    "mask_indices(n, mask_func[, k])|给定掩码函数，将索引返回到访问（n，n）数组。\n",
    "tril_indices(n[, k, m])|返回 (n, m) 数组下三角的索引。\n",
    "tril_indices_from(arr[, k])|返回arr下三角的索引。\n",
    "triu_indices(n[, k, m])|返回 (n, m) 数组上三角的索引。\n",
    "triu_indices_from(arr[, k])|返回arr的上三角的索引。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "7153c493-f854-4382-be2d-5bc8428b9d6c",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([1, 1, 1, 2, 2, 2]), array([0, 1, 2, 0, 1, 2]))"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])\n",
    "np.nonzero(a > 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "22a808c6-a00f-4ee6-862d-7d3f2f574f21",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  1,  2],\n",
       "       [ 0,  2, -1],\n",
       "       [ 0,  3, -1]])"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([[0, 1, 2],\n",
    "              [0, 2, 4],\n",
    "              [0, 3, 6]])\n",
    "np.where(a < 4, a, -1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "52828a7c-2f2c-4ee4-a672-a372c47fd972",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 1, 2, 3, 4],\n",
       "       [5, 6, 7, 8, 9]])"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.arange(10).reshape(2, 5)\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "3a5d8f06-a318-42f3-bdee-b0071dcba5f7",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[0],\n",
       "        [1]]),\n",
       " array([[2, 4]]))"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ixgrid = np.ix_([0, 1], [2, 4])\n",
    "ixgrid"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "1067640a-d8fd-4ab9-814a-46035cd1aed4",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((2, 1), (1, 2))"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ixgrid[0].shape, ixgrid[1].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "a7205584-d595-4386-94dd-f56ca4d9c694",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[2, 4],\n",
       "       [7, 9]])"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a[ixgrid]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "8df3ba5e-4798-40e7-817d-f85ffe36bd05",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([0, 1, 2, 3]), array([0, 1, 2, 3]))"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "di = np.diag_indices(4)\n",
    "di"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "5da2f4ba-ca9c-4de2-94eb-a1308486c969",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0,  1,  2,  3],\n",
       "       [ 4,  5,  6,  7],\n",
       "       [ 8,  9, 10, 11],\n",
       "       [12, 13, 14, 15]])"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.arange(16).reshape(4, 4)\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "21213d14-bffc-4a92-a7ad-d9e27c80f5af",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[100,   1,   2,   3],\n",
       "       [  4, 100,   6,   7],\n",
       "       [  8,   9, 100,  11],\n",
       "       [ 12,  13,  14, 100]])"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a[di] = 100\n",
    "a"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "31d43b11-79ae-48ce-8074-ce23b1ade391",
   "metadata": {},
   "source": [
    "## 类似于索引的操作\n",
    "\n",
    "方法|描述\n",
    "--:|:--\n",
    "take(a, indices[, axis, out, mode])|沿轴从数组中获取元素。\n",
    "take_along_axis(arr, indices, axis)|通过匹配1d索引和数据切片从输入数组中获取值。\n",
    "choose(a, choices[, out, mode])|从索引数组和一组数组中构造一个数组以供选择。\n",
    "compress(condition, a[, axis, out])|沿给定轴返回数组的选定切片。\n",
    "diag(v[, k])|提取对角线或构造对角线阵列。\n",
    "diagonal(a[, offset, axis1, axis2])|返回指定的对角线。\n",
    "select(condlist, choicelist[, default])|根据条件返回从Choicelist中的元素中提取的数组。\n",
    "lib.stride_tricks.as_strided(x[, shape, …])|使用给定的形状和步幅在阵列中创建视图。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "caad77ae-f4ad-48d2-9429-7f962fca87f4",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
